;
;
;  CLIB - A COLLECTION OF MACROS & DEFINITIONS USED IN ICRT AND OTHER THINGS.
;
; ________________________________________________________________
; DONALD E. KILLEN   VERSION 2.02       JAN 21, 1981             |
;                    -- FOR THE Z80 ONLY -- PREF. MACRO-80       |
; ________________________________________________________________
;
	.Z80
;
TRUE	EQU	0FFFFH	; DEFINE VALUE OF .TRUE. FOR THOSE WHO NEED IT.
FALSE	EQU	NOT TRUE
;
MSIZE	EQU	55	; DECIMAL KBYTES ... REQUIRED FOR SGEN.
;
;


;
; ASCII VALUES DEFINED:
;
BS	EQU	08H	; BACKSPACE
LF	EQU	0AH	; LINE FEED
CR	EQU	0DH	; CARRIAGE RETURN
;
DEL	EQU	7FH	; => DELETE CHAR. (KEY R1)
ENQ	EQU	05H	; => PHYSICAL END LINE
NAK	EQU	15H	; => DELETE LINE
ETX	EQU	03H	; => CODE + C => WARM BOOT
SUB	EQU	1AH	; => CODE + Z => END INPUT ED & PIP
DLE	EQU	10H	; => CODE + P => TOGGLE COPY TO PRINTER
DC3	EQU	13H	; => CODE + S => START/STOP CONSOLE OUTPUT
TAB	EQU	09H	; = (HORIZ) TAB KEY.
CODEZ	EQU	1AH	; => CODE + Z    SEE ABOVE
CODES	EQU	13H	; => CODE + S    SEE ABOVE
ACCENT	EQU	60H	; =>  `  => ACCENT MARK
TILDE	EQU	7EH	; =>  ~  => TILDE
UPAROW	EQU	5EH	; =>  ^  => UP ARROW
LBRAK	EQU	5BH	; =>  [  => LEFT BRACKET
RBRAK	EQU	5DH	; =>  ]  => RIGHT BRACKET
BSLASH	EQU	5CH	; =>  \  => BACK SLASH
LOGOR	EQU	7CH	; =>  |  => LOGICAL INCLUSIVE OR
LBRACE	EQU	7BH	; =>  {  => LEFT BRACE (CODE + LN PAREN.)
RBRACE	EQU	7DH	; =>  }  => RIGHT BRACE (CODE + R. PAREN.)
CODEX	EQU	18H	; => CODE + X => DELETE LINE
CODEP	EQU	10H	; => CODE + P => TOGGLE COPY TO PRINTER
NULL	EQU	00H	; NULL - SHOULD NEVER BE ENCOUNTERED.
;
;
;  ICRT DEFINITIONS & SUCHLIKE
;
VT	EQU	0BH	; VERTICAL TAB
HT	EQU	09H	; HORIZONTAL TAB
ESC	EQU	1BH	; ESCAPE CODE
ICH	EQU	40H	; INSERT CHARACTER
CUU	EQU	41H	; CURSOR UP
CUD	EQU	42H	; CURSOR DOWN
CUF	EQU	43H	; CURSOR FORWARD
CUB	EQU	44H	; CURSOR BACKWARDS
CNL	EQU	45H	; CURSOR NEXT LINE
CPL	EQU	46H	; CURSOR PRECEDING LINE
CHA	EQU	47H	; CURSOR HORIZONTAL ABSOLUTE
CUP	EQU	48H	; CURSOR POSITION
CHT	EQU	49H	; CURSOR HORIZONTAL TAB
ED	EQU	4AH	; ERASE IN DISPLAY
EL	EQU	4BH	; ERASE IN LINE
IL	EQU	4CH	; INSERT LINE
DL	EQU	4DH	; DELETE LINE
DCH	EQU	50H	; DELETE CHARACTER
SU	EQU	53H	; SCROLL UP
SD	EQU	54H	; SCROLL DOWN
CTC	EQU	57H	; CURSOR TAB CONTROL
CVT	EQU	59H	; CURSOR VERTICAL TAB
CBT	EQU	5AH	; CURSOR BACKWARDS TAB
CVA	EQU	5BH	; CURSOR VERTICAL ABSOLUTE
SGR	EQU	6DH	; SELECT GRAPHIC RENDITION
;
;
; VB3 ATTRIBUTE DEFINITIONS:
;
NORMAL	EQU	3	; NORMAL ATTRIBUTE
REVERSE	EQU	4	; BLACK ON WHITE
BLANK	EQU	8	; NOTHING..
UNDERLINE  EQU	16	; ___ EVERYTHING
BLINK	EQU	32	; BLINK THE CHAR.
STRIKE$THRU EQU 64	; / THROUGH THE CHAR.
REDUCE	EQU	128	; GREY ZONE.
;
;*** 80X33.LIB -- 80 COLUMNS BY 33 ROWS, TV STANDARDS
;
;*** HARDWARE CONFIGURATION
;
;    16 MHZ DOT CLOCK
;     9 DOTS PER CHARACTER
;    80 CHARACTER PROMS (STANDARD OR WHATEVER -- )
;
;*** DEFINE THE EQUATES NEEDED FOR THE VB3 BOARD:
;
VIDEOX	EQU	0E000H	;RELATIVE ADDRESS OF THE VIDEO MEMORY
OFFSET	EQU	01000H	;RELATIVE OFFSET TO THE ATTRIBUTE
VTAC	EQU	0D0H	;I/O ADDRESS OF THE (VTAC) VIDEO CONTROLLER
KSTAT	EQU	0E0H	;KEYBOARD STATUS / VB3 BOARD DISABLE PORT
KDATA	EQU	0E1H	;KEYBOARD DATA  / VB3 BOARD ENABLE  PORT
;
NCOLS	EQU	80	;DEFINE SCREEN WIDTH
CODE	EQU	5	; THE 'CODE' FOR 80 COLUMNS...
NROWS	EQU	33	;DEFINE SCREEN HEIGTH (NO. LINES)
SKEW	EQU	0	;NO SKEW BELEIVED REQUIRED --
SCANF	EQU	525	;SCANS PER FRAME (RASTER)
SCANR	EQU	15	;SCANS PER DATA ROW (LINE)
HCOUNT	EQU	113	;CHARACTER TIMES IN ONE HORIZ. SCAN LINE --
CRT5027	EQU	FALSE
CRT5037	EQU	TRUE	;THIS IS THE TYPE OF VTAC USED --
INTERLACED	EQU	TRUE	;WE ARE INTERLACING -----
;
;
PUSHALL	MACRO	;PUSH EVERYTHING IN THE PLACE ONTO THE STACK.
	PUSH	AF
	PUSH	HL
	PUSH	DE
	PUSH	BC
	ENDM
;
POPALL	MACRO		;LIKEWISE, POP EVERYTHING FROM THE STACK.
	POP	BC
	POP	DE
	POP	HL
	POP	AF
	ENDM
;
; SWIN   OLD,NEW
;
;     SWAP OUT WORLD, STORE STACK POINTER AT PLACCE 'OLD',
;                     GET NEW ONE FROM 'NEW', STORE REGISTERS:
;
SWIN	MACRO	OLD,NEW
	LD	(OLD),SP	; SAVE CALLER'S POINTER
	LD	SP,(NEW)	; GET NEW POINTER
	PUSH	AF
	PUSH	HL
	PUSH	DE
	PUSH	BC
	ENDM
;
; SWOT   OLD,NEW
;
;   	SWAP WORLD BACK - REVERSE OF SWIN.
;
SWOT	MACRO	OLD2,NEW2
	POP	BC
	POP	DE
	POP	HL
	POP	AF
	LD	(NEW2),SP	; SAVE THIS PROGRAM'S POINTER
	LD	SP,(OLD2)	; GET THE CALLING POINTER
	ENDM
;
;
;  STORE CURRENT SP, GET CALLING PROGRAM'S SP --
;   PREPARATORY TO CALLING A PROGRAM KNOWN TO REQUIRE ITS
;   OWN STACK, SUCH AS CP/M OR CBIOS.
;
;  SPOT => PRIOR TO CALL, STORE OLD, GET NEW:
;
;	SPOT	OLDSP,TEMPNEWSP
;
;  SPIN => FOLLOWING THE CALL, INVERSE:
;
;	SPIN	OLDSP,TEMPNEWSP   ; RESTORES OWN SP
;
SPOT	MACRO	OSP,NSP
	LD	(NSP),SP
	LD	SP,(OSP)
	ENDM
;
SPIN	MACRO	OSP,NSP
	LD	(OSP),SP
	LD	SP,(NSP)		;; & GET OWN (NEW) SP BACK.
	ENDM
;
;
;  STORE A REGISTER (SINGLE):
;   -- IF USING ANY OTHER THAN -A-, THIS DESTROYS <A>.
;
STORE	MACRO	LOC,REG
	LOCAL	LABA
LABA	EQU	'A'
	IF '&REG' EQ LABA
	LD	(LOC),A		;; STORE A.
	ELSE
	LD	A,REG		;; DESTROYS <A>
	LD	(LOC),A
	ENDIF
	ENDM
;
;
;  ****  ICRT-UNIQUE DEFINITIONS & MACROS ******
;
;
;  MACRO TO DO A 16-BIT COMPARE ON THE HL REGISTER.
;    - WORKS WITH:  BC, DE, AF, IX, IY
;
;	CMPD	REGP	; COMPARES -HL- WITH -REGP-
;
CMPD	MACRO	 REGP 
	LOCAL 	L1,L2,L3,L4,L5,L6,L7,CMPD1,CMPD2
	.8080
L1	SET	'BC'
L2	SET	'DE'
L3	SET	'IX'
L4	SET	'IY'
L5	SET	'AF'
L6	SET	'PC'
L7	SET	'SP'
	.Z80
;
     IF '&REGP' EQ L1
	 LD	A,H
	 CP	B
	 JR	NZ,CMPD1
	 LD	A,L
	 CP	C
     ENDIF
;
     IF '&REGP' EQ L2
	 LD	A,H
	 CP	D
	 JR	NZ,CMPD1
	 LD	A,L
	 CP	E
     ENDIF
;
     IF '&REGP' EQ L3
	 PUSH	BC
	 PUSH	IX	;; PUT IX IN BC
	 POP	BC
	 LD	A,H
	 CP	B
	 JR	NZ,CMPD2  ;; MUST POP BC
	 LD	A,L
	 CP	C
	 JR	CMPD2	;; MUST POP BC
     ENDIF
;
     IF '&REGP' EQ L4
	 PUSH	BC
	 PUSH	IY
	 POP	BC
	 LD	A,H
	 CP	B
	 JR	NZ,CMPD2  ;; MUST POP BC
	 LD	A,L
	 CP	C
	 JR	CMPD2	  ;; MUST POP BC
     ENDIF
;
     IF '&REGP' EQ L5
	 PUSH	BC
	 PUSH	AF
	 POP	BC	;; PUT AF IN BC
	 LD	A,H
	 CP	B
	 JR	NZ,CMPD2  ;; MUST POP BC
	 LD	A,L
	 CP	C
	 JR	CMPD2	  ;; MUST POP BC
     ENDIF
;
     IF '&REGP' EQ L6
	 PUSH	BC	;; DOING PC, SAVE BC
	 CALL	ZZZZ
	LD	A,H
	CP	B
	JR	NZ,CMPD2
	LD	A,L
	CP	C
	JR	CMPD2	;; MUST RESTORE BC
;
ZZZZ:	POP	BC	;; GET PC FROM STACK TO BC.
	PUSH	BC	;; PUT IT BACK GOING TO
	RET		;;  RETURN...
;
;
     ENDIF
;
     IF '&REGP' EQ L7
	PUSH	BC
	PUSH	SP
	POP	BC
	LD	A,H
	CP	B
	JR	NZ,CMPD2
	LD	A,L
	CP	B
	JR	CMPD2	;; SAVE BC BEFORE EXITING
     ENDIF
;
  IF '&REGP' NE L1 AND '&REGP' NE L2
CMPD2:	 POP	BC	;; RESTORE BC
  ENDIF
CMPD1:
	ENDM
;
;       MXI	REGP,ROW,COL	; SETS THE 16-BIT REGISTER TO THE
;				; VALUE  ROW*256 + COL.
;				; CAN NE USED WITH ANY LOADABLE PAIR.
;
MXI	MACRO	REGP,ROW,COL
	LOCAL	X,Y,Z
	.8080
X	SET	ROW
Y	SET	COL
Z	SET	(X * 256 + Y) AND 0FFFFH
	.Z80
	LD	REGP,Z
	ENDM
;
;
;  CIJR:   COMPARE (A) IMMEDIATE, AND DO A CONDITIONAL RELATIVE JUMP:
;
;	CIJR	DATA,CONDITION,LOCATION
;
;  GENERATES:
;
;	CP	DATA
;	JP	CONDITION,LOCATION
;  NOTE:  NO TEST IS MADE FOR OUT-OF-RANGE CONDITIONAL JUMP.
;  ____
;
CIJR	MACRO	DATA,COND,PLACE
	CP	DATA
	JP	COND,PLACE
	ENDM
;
; DOIT:  A MACRO TO PERFORM LOTS OF OTHERWISE REDUNDANT CODE IN ICRT,
;        AND MAKE SOME TESTS AND CALL AN OPTIONAL ROUTINE.
;
;	DOIT	VALUE,CONDITION,ROUTINE
;
DOIT	MACRO	VALUE,COND,ROUT
	LOCAL	XX
	LD	A,VALUE
	CALL	GET1P		;; THIS IS AN ICRT SUBROUTINE.
	RET	COND
	LD	B,A
XX: 	PUSH	BC
	CALL	ROUT
	POP	BC
	DJNZ	XX
	RET
	ENDM
;
;
;  DOSP:  A SPECIAL-PURPOSE MACRO TO SUPPORT ICRT:
;
DOSP	MACRO	V1,C1,R1,R2,H2,L2,REG
	LOCAL	XX1,XX2,Y,Z
	.8080
Y	SET	NORMAL
Z	SET	' '
	.Z80
;
	LD	A,V1
	CALL	GET1P
	JP	C1,R1	; CONDITIONAL JUMP TO ROUTINE R1.
	PUSH	HL
	CP	1
	JR	NZ,XX1
	EX	DE,HL
	LD	H,H2	; VALUE <H2> GOES IN REG. H
	LD	L,L2	; VALUE <L2> GOES IN REG. L
	MXI	BC,Y,Z
	CALL	FILLS
	JR	XX2
XX1: 	CP	2
	JR	NZ,XX2
	LD	REG,0	; LOAD ZERO IN SPECIFIED REGISTER.
	CALL	R2	; CALL ROUTINE R2.
XX2: 	POP	HL
	RET
	ENDM
;
;  WCTC:  THIS MACRO SUPPORTS ICRT SUBROUTINES CTC0...CTC6.
;
;         'OPT' IS A BINARY QUANTUM AND MAY BE NULL OR ANY CHAR(S).
;
WCTC	MACRO	NAM,QUAN,OPT
;
	IFNB <OPT>
	LD	L,H
	ENDIF
;
	LD	H,0
	LD	DE,NAM
	ADD	HL,DE
	LD	(HL),QUAN
	RET
;
	ENDM
;
;  GGP:	  THIS MACRO EXPANDS TO:
;
;	LD	A,QUAN
;	CALL	GET1P
;
;  PLUS RET	COND	; DO A CONDITIONAL RETURN IF THE CONDITION
;			  IS SPECIFIED IN THE MACRO CALL.  IF IT IS NULL,
;				DO NOT PERFORM THE RETURN.
;
;
GGP	MACRO	QUAN2,COND2
	LD	A,QUAN2
	CALL	GET1P
;
	IFNB <COND2>
	RET	COND2
	ENDIF
;
	ENDM
;
;  MAPX:  GENERATES A TABLE OF VIDEO LOCATIONS BASED
;
;         ON VIDEOX, NCOLS, & NROWS
;
MAPX	MACRO
	LOCAL	I,J
	.8080
J	SET	(NCOLS + 15) AND 0FFF0H
I	SET	0
;
	REPT	NROWS
	 DW	VIDEOX + J * I
I	 SET	I + 1
	ENDM
;
	ENDM
	.Z80
;
;
;
;
;
;
